package ar.edu.utn.frgp.TPFinalBanco.model;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Table;

import ar.edu.utn.frgp.TPFinalBanco.model.pk.MovimientoPk;

@Entity()
@Table(name = "Movimiento")
public class Movimiento implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	@EmbeddedId
    private MovimientoPk movimientoPk;
	
	@Column(name="fecha")
	private Date fecha;
	
	//[EXTRACCIÓN|DEPÓSITO]
	@Enumerated(EnumType.STRING)
	@Column(name="tipoMov")
	private TipoMovimientoEnum tipoMov;

	@Enumerated(EnumType.STRING)
	@Column(name="origen")
	private OrigenMovEnum origen;
	
	@Column(name="saldoActual")
	private BigDecimal saldoActual;
	
	@Column(name="montoMov")
	private BigDecimal montoMov;
	
	
	//**************** CONSTRUCTOR ****************
	
	public Movimiento(){
	}

	public Movimiento(Cuenta cuenta, Date fecha,
			TipoMovimientoEnum tipoMov, OrigenMovEnum origen,
			BigDecimal saldoActual, BigDecimal montoMov) {
		super();
		this.movimientoPk = new MovimientoPk();
		this.movimientoPk.setCuenta(cuenta);
		this.fecha = fecha;
		this.tipoMov = tipoMov;
		this.origen = origen;
		this.saldoActual = saldoActual;
		this.montoMov = montoMov;
	}

	//**************** GETTERS Y SETTERS ****************

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public TipoMovimientoEnum getTipoMov() {
		return tipoMov;
	}

	public void setTipoMov(TipoMovimientoEnum tipoMov) {
		this.tipoMov = tipoMov;
	}

	public OrigenMovEnum getOrigen() {
		return origen;
	}

	public void setOrigen(OrigenMovEnum origen) {
		this.origen = origen;
	}

	public BigDecimal getSaldoActual() {
		return saldoActual;
	}

	public void setSaldoActual(BigDecimal saldoActual) {
		this.saldoActual = saldoActual;
	}

	public BigDecimal getMontoMov() {
		return montoMov;
	}

	public void setMontoMov(BigDecimal montoMov) {
		this.montoMov = montoMov;
	}

	public MovimientoPk getMovimientoPk() {
		return movimientoPk;
	}

	public void setMovimientoPk(MovimientoPk movimientoPk) {
		this.movimientoPk = movimientoPk;
	}

	@Override
	public String toString() {
		return "Movimiento [idMov=" + movimientoPk.getIdMov() + ", nroCuenta=" + movimientoPk.getCuenta().getNroCuenta()
				+ ", fecha=" + fecha + ", tipoMov=" + tipoMov + ", origen="
				+ origen + ", saldoActual=" + saldoActual + ", montoMov="
				+ montoMov + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((movimientoPk.getIdMov() == null) ? 0 : movimientoPk.getIdMov().hashCode());
		result = prime * result
				+ ((movimientoPk.getCuenta() == null) ? 0 : movimientoPk.getCuenta().hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Movimiento other = (Movimiento) obj;
		if (movimientoPk.getIdMov() == null) {
			if (other.movimientoPk.getIdMov() != null)
				return false;
		} else if (!movimientoPk.getIdMov().equals(other.movimientoPk.getIdMov()))
			return false;
		if (movimientoPk.getCuenta() == null) {
			if (other.movimientoPk.getCuenta() != null)
				return false;
		} else if (!movimientoPk.getCuenta().equals(other.movimientoPk.getCuenta()))
			return false;
		return true;
	}
}
